package com.tomorrowbbs.controller.base;

import com.tomorrowbbs.controller.base.ABaseController;
import com.tomorrowbbs.domain.vo.ResponseVo;
import com.tomorrowbbs.domain.enums.ResponseCodeEnum;
import com.tomorrowbbs.exception.BusinessException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.context.properties.bind.BindException;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException;
import org.springframework.web.servlet.NoHandlerFoundException;

import javax.servlet.http.HttpServletRequest;

@RestControllerAdvice
public class AGlobalExceptionHandlerController extends ABaseController {
    private static final Logger logger = LoggerFactory.getLogger(AGlobalExceptionHandlerController.class);

    @ExceptionHandler(value = Exception.class)
    Object handleException(Exception e, HttpServletRequest request) {
        logger.error("请求错误 请求地址{}, 错误信息：",request.getRequestURI(),e);
        ResponseVo ajaxResponse = new ResponseVo();
        //404
        if(e instanceof NoHandlerFoundException){
            ajaxResponse.setCode(ResponseCodeEnum.CODE_404.getCode());
            ajaxResponse.setInfo(ResponseCodeEnum.CODE_404.getMsg());
            ajaxResponse.setStatus(STATUC_ERROR);
        } else if(e instanceof BusinessException){
            //业务错误
            BusinessException bizEx = (BusinessException) e;
            ajaxResponse.setCode(bizEx.getCode()==null ? ResponseCodeEnum.CODE_600.getCode() : bizEx.getCode());
            ajaxResponse.setInfo(bizEx.getMessage());
            ajaxResponse.setStatus(STATUC_ERROR);
        }else if (e instanceof BindException || e instanceof MethodArgumentTypeMismatchException) {
            //参数校验错误
            ajaxResponse.setCode(ResponseCodeEnum.CODE_600.getCode());
            ajaxResponse.setInfo(ResponseCodeEnum.CODE_600.getMsg());
            ajaxResponse.setStatus(STATUC_ERROR);
        } else if (e instanceof DuplicateKeyException) {
            //主键冲突
            ajaxResponse.setCode(ResponseCodeEnum.CODE_601.getCode());
            ajaxResponse.setInfo(ResponseCodeEnum.CODE_601.getMsg());
            ajaxResponse.setStatus(STATUC_ERROR);
        }else{
            ajaxResponse.setCode(ResponseCodeEnum.CODE_500.getCode());
            ajaxResponse.setInfo(ResponseCodeEnum.CODE_500.getMsg());
            ajaxResponse.setStatus(STATUC_ERROR);
        }
        return ajaxResponse;
    }
}
